home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / source / music4c.sit / Music4C Folder / Sources Folder / AIFFHeaderV3.c < prev    next >
C/C++ Source or Header  |  1990-06-16  |  8KB  |  255 lines

  1. #include    "Music4C.h"
  2. #include    "Music4C_mac.h"
  3. #include    "AIFFtype.h"
  4. #include    <SANE.h>
  5. #include    <ToolboxUtil.h>
  6. #include    <unix.h>
  7.  
  8.  
  9. extern    OSErr    theErr;
  10.  
  11. prepareAIFFfile(TotalDuration, nchnls)
  12.     double    TotalDuration;
  13.     int    nchnls;
  14. {
  15.     register    i;
  16.     double    x;
  17.     Str255    myStr255;
  18.     extern    OSErr    errnum;
  19.     long    aLong;
  20.     extern    double    srate;
  21.     int    resid;
  22.     Chunk            FormChunkHeader, *FormChunkHeaderPtr;
  23.     CommonChunk        CommonHeader, *CommonHeaderPtr;
  24.     SoundDataChunk    SoundDataHeader, *SoundDataHeaderPtr;
  25.     MarkerChunk        MarkerChunkHeader, *MarkerChunkHeaderPtr;
  26.     InstrumentChunk        InstHeader, *InstHeaderPtr;
  27.     long            TotalSamps;
  28.     extern            Boolean            AIFFoddByte;
  29.     extern            double        srate;        /* sampling rate */
  30.     extern            Str255        SoundFileName;
  31.     extern            ioParam        myIOParmBlk;
  32.     extern        long            SampleRate;
  33.     
  34.     Fixed    aFix;
  35.     Extended80    exNum;
  36.     
  37.  
  38.     FormChunkHeaderPtr = &FormChunkHeader;
  39.     CommonHeaderPtr = &CommonHeader;
  40.     SoundDataHeaderPtr = &SoundDataHeader;
  41.     aLong =  (long)(TotalDuration * nchnls * srate);
  42.     resid =  (int)(aLong % 512L);
  43.     if ( resid != 0 ) {
  44.         aLong += (long)(512 - resid) + 512L;;
  45.     }
  46.     TotalSamps = aLong;
  47.  
  48. /* initialize Form Chunk info */
  49.     FormChunkHeader.ckID = 'FORM';
  50.     FormChunkHeader.formType = 'AIFF';
  51.  
  52.  
  53. /* initialize Common Chunk info */
  54.     CommonHeader.ckID = 'COMM';
  55.     CommonHeader.ckSize = sizeof( CommonHeader.numChannels ) +
  56.                             sizeof( CommonHeader.numSampleFrames ) +
  57.                             sizeof( CommonHeader.sampleSize ) +
  58.                             sizeof( CommonHeader.sampleRate );
  59.     CommonHeader.numChannels = (short)nchnls;
  60.     CommonHeader.numSampleFrames = (unsigned long)(TotalSamps / nchnls);
  61.     CommonHeader.sampleSize = SixteenBits;
  62.  
  63. /* can't figure out how to convert sample rate TO extended format
  64.     in version 3 of THINK C, so just shove in some numbers to fake it */
  65.     CommonHeader.sampleRate.exponent = 0x400E;
  66.     CommonHeader.sampleRate.mantissa.long1 = (long)srate;
  67.     CommonHeader.sampleRate.mantissa.long2 = 0;
  68.     
  69.     aFix = X2Fix( &CommonHeader.sampleRate);
  70.     SampleRate = (long) aFix;
  71.  
  72.  
  73.     SoundDataHeader.ckID = 'SSND';
  74.     SoundDataHeader.offset = 0L;
  75.     SoundDataHeader.blockSize = 0L;
  76.  
  77.     SoundDataHeader.ckSize = sizeof( SoundDataHeader.offset ) +
  78.                                 sizeof( SoundDataHeader.blockSize ) +
  79.                                 (long)(TotalSamps * sizeof(int));
  80.                                 
  81.                                 
  82.                                 
  83.     FormChunkHeader.ckSize = sizeof(FormChunkHeader.formType);
  84.     
  85.     FormChunkHeader.ckSize += (sizeof(CommonHeader.ckID) + 
  86.                             sizeof(CommonHeader.ckSize)
  87.                                 + CommonHeader.ckSize);
  88.                                 
  89.     FormChunkHeader.ckSize += (sizeof(SoundDataHeader.ckID) + 
  90.                                 sizeof(SoundDataHeader.ckSize)
  91.                                 + SoundDataHeader.ckSize);
  92.                                 
  93.     if ( FormChunkHeader.ckSize % 2 != 0 )
  94.         AIFFoddByte = TRUE;
  95.     else
  96.         AIFFoddByte = FALSE;
  97.  
  98.                                 
  99. /* write out header info */
  100.     myIOParmBlk.ioReqCount = sizeof(FormChunkHeader);
  101.     myIOParmBlk.ioBuffer = (Ptr)FormChunkHeaderPtr;
  102.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  103.         OSError("\pError writing Header to sample file", NIL);
  104.     }
  105.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  106.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  107.     }
  108.  
  109.     myIOParmBlk.ioReqCount = sizeof(CommonHeader);
  110.     myIOParmBlk.ioBuffer = (Ptr)CommonHeaderPtr;
  111.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  112.         OSError("\pError writing Header to sample file", NIL);
  113.     }
  114.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  115.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  116.     }
  117.  
  118.     myIOParmBlk.ioReqCount = sizeof(SoundDataHeader);
  119.     myIOParmBlk.ioBuffer = (Ptr)SoundDataHeaderPtr;
  120.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  121.         OSError("\pError writing Header to sample file", NIL);
  122.     }
  123.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  124.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  125.     }
  126. }
  127.  
  128.  
  129. FixHeaderInfo()
  130. {
  131. /* this is a kludgey way to ensure that the AIFF file header
  132. * info is accurate. We just read it all back again from the file
  133. * and patch it up.
  134. */
  135.  
  136.     register    i;
  137.     Str255    myStr255;
  138.     double    x;
  139.     extern    OSErr    errnum;
  140.     extern        double        srate;
  141.     long    aLong;
  142.     int    resid;
  143.     Chunk            FormChunkHeader, *FormChunkHeaderPtr;
  144.     CommonChunk        CommonHeader, *CommonHeaderPtr;
  145.     SoundDataChunk    SoundDataHeader, *SoundDataHeaderPtr;
  146.     MarkerChunk        MarkerChunkHeader, *MarkerChunkHeaderPtr;
  147.     InstrumentChunk        InstHeader, *InstHeaderPtr;
  148.     extern            long        TotalSamps;
  149.     extern            Boolean        AIFFoddByte;
  150.     extern            double        srate;        /* sampling rate */
  151.     extern            Str255        SoundFileName;
  152.     extern            ioParam        myIOParmBlk;
  153.     extern            int            nchnls;
  154.     extern        long            SampleRate;
  155.     
  156.     Fixed    aFix;
  157.     Extended80    exNum;
  158.  
  159.     FormChunkHeaderPtr = &FormChunkHeader;
  160.     CommonHeaderPtr = &CommonHeader;
  161.     SoundDataHeaderPtr = &SoundDataHeader;
  162.  
  163.  
  164. /* reset file position to start */
  165.  
  166.     myIOParmBlk.ioPosMode = fsFromStart;
  167.     myIOParmBlk.ioPosOffset = 0L;
  168.     errnum = PBSetFPos(&myIOParmBlk, FALSE);
  169.     myIOParmBlk.ioPosMode = fsAtMark;
  170.  
  171.  
  172.  
  173.  
  174. /* initialize Form Chunk info */
  175.     FormChunkHeader.ckID = 'FORM';
  176.     FormChunkHeader.formType = 'AIFF';
  177.  
  178.  
  179. /* initialize Common Chunk info */
  180.     CommonHeader.ckID = 'COMM';
  181.     CommonHeader.ckSize = sizeof( CommonHeader.numChannels ) +
  182.                             sizeof( CommonHeader.numSampleFrames ) +
  183.                             sizeof( CommonHeader.sampleSize ) +
  184.                             sizeof( CommonHeader.sampleRate );
  185.     CommonHeader.numChannels = (short)nchnls;
  186.     CommonHeader.numSampleFrames = (unsigned long)(TotalSamps / nchnls);
  187.     CommonHeader.sampleSize = SixteenBits;
  188.  
  189.  
  190. /* can't figure out how to convert sample rate TO extended format
  191.     in version 3 of THINK C, so just shove in some numbers to set
  192.     to 44100 */
  193.     CommonHeader.sampleRate.exponent = 0x400E;
  194.     CommonHeader.sampleRate.mantissa.long1 = (long)srate;
  195.     CommonHeader.sampleRate.mantissa.long2 = 0;
  196.     
  197.     aFix = X2Fix( &CommonHeader.sampleRate);
  198.     SampleRate = (long) aFix;
  199.  
  200.  
  201.     SoundDataHeader.ckID = 'SSND';
  202.     SoundDataHeader.offset = 0L;
  203.     SoundDataHeader.blockSize = 0L;
  204.  
  205.     SoundDataHeader.ckSize = sizeof( SoundDataHeader.offset ) +
  206.                                 sizeof( SoundDataHeader.blockSize ) +
  207.                                 (long)(TotalSamps * sizeof(int));
  208.                                 
  209.                                 
  210.                                 
  211.     FormChunkHeader.ckSize = sizeof(FormChunkHeader.formType);
  212.     
  213.     FormChunkHeader.ckSize += (sizeof(CommonHeader.ckID) + 
  214.                             sizeof(CommonHeader.ckSize)
  215.                                 + CommonHeader.ckSize);
  216.                                 
  217.     FormChunkHeader.ckSize += (sizeof(SoundDataHeader.ckID) + 
  218.                                 sizeof(SoundDataHeader.ckSize)
  219.                                 + SoundDataHeader.ckSize);
  220.                                 
  221.     if ( FormChunkHeader.ckSize % 2 != 0 )
  222.         AIFFoddByte = TRUE;
  223.     else
  224.         AIFFoddByte = FALSE;
  225.  
  226.                                 
  227. /* REwrite out header info */
  228.     myIOParmBlk.ioReqCount = sizeof(FormChunkHeader);
  229.     myIOParmBlk.ioBuffer = (Ptr)FormChunkHeaderPtr;
  230.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  231.         OSError("\pError writing Header to sample file", NIL);
  232.     }
  233.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  234.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  235.     }
  236.  
  237.     myIOParmBlk.ioReqCount = sizeof(CommonHeader);
  238.     myIOParmBlk.ioBuffer = (Ptr)CommonHeaderPtr;
  239.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  240.         OSError("\pError writing Header to sample file", NIL);
  241.     }
  242.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  243.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  244.     }
  245.  
  246.     myIOParmBlk.ioReqCount = sizeof(SoundDataHeader);
  247.     myIOParmBlk.ioBuffer = (Ptr)SoundDataHeaderPtr;
  248.     if ( (errnum = PBWrite(&myIOParmBlk, FALSE)) != noErr ) { 
  249.         OSError("\pError writing Header to sample file", NIL);
  250.     }
  251.     if ( myIOParmBlk.ioActCount != myIOParmBlk.ioReqCount) {
  252.         OSError("\pError writing Header to file, wrote wrong number of bytes", NIL);
  253.     }
  254. }
  255.